package com.whalecloud.chart.service.draw;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.whalecloud.chart.domain.DrawChartRequestDTO;
import com.whalecloud.chart.service.AbstractChartService;
import com.whalecloud.chart.service.dto.BubbleValue;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.xy.DefaultXYZDataset;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description 气泡图
 * @Author MarkAsh
 * @Date 2025/2/22
 **/
public class BubbleChartService extends AbstractChartService {

    /**
     * 创建数据集
     *
     * @param sourceData 源数据
     * @return 数据集
     */
    @Override
    public DefaultCategoryDataset createDataset(JSONArray sourceData) {
        return null;
    }

    /**
     * 绘制图表
     *
     * @param dataset 数据集
     * @return 图表
     */
    @Override
    public JFreeChart createChart(DefaultCategoryDataset dataset) {
        return null;
    }

    /**
     * 创建图表
     *
     * @param requestDTO 源数据
     * @return 图片文件
     */
    @Override
    public File drawChartFile(DrawChartRequestDTO requestDTO) {

        JSONArray sourceData = requestDTO.getSourceData();
        // 创建数据
        DefaultXYZDataset dataset = new DefaultXYZDataset();
        List<Double> xvList = new ArrayList<>();
        List<Double> yvList = new ArrayList<>();
        List<Double> zvList = new ArrayList<>();
        sourceData.forEach(item -> {
            BubbleValue bubbleValue = JSONObject.parseObject(JSONObject.toJSONString(item), BubbleValue.class);
            double xv = NumberUtil.isNumber(bubbleValue.getXv()) ? Double.parseDouble(bubbleValue.getXv()) : 0d;
            double yv = NumberUtil.isNumber(bubbleValue.getYv()) ? Double.parseDouble(bubbleValue.getYv()) : 0d;
            double zv = NumberUtil.isNumber(bubbleValue.getZv()) ? Double.parseDouble(bubbleValue.getZv()) : 0d;

            xvList.add(xv);
            yvList.add(yv);
            zvList.add(zv);
        });
        // 将List转成数组
        double[] xv = xvList.stream().mapToDouble(Double::doubleValue).toArray();
        double[] yv = yvList.stream().mapToDouble(Double::doubleValue).toArray();
        double[] zv = zvList.stream().mapToDouble(Double::doubleValue).toArray();
        dataset.addSeries("", new double[][]{xv, yv, zv});

        // 创建绘图对象
        JFreeChart bubbleChart = ChartFactory.createBubbleChart(
                StrUtil.blankToDefault(requestDTO.getTitle(), "Example"), // 图标标题
                StrUtil.blankToDefault(requestDTO.getXLabel(), "X轴"), // X轴标签
                StrUtil.blankToDefault(requestDTO.getYLabel(), "Y轴"), // Y轴标签
                dataset,
                PlotOrientation.VERTICAL,
                false,
                true,
                true
        );
        return super.createChartImage(bubbleChart);
    }

    /**
     * 获取示例数据
     *
     * @return 示例数据
     */
    @Override
    public JSONArray getSampleData() {
        List<BubbleValue> bubbleValues = List.of(
                new BubbleValue("1", "10", "10"),
                new BubbleValue("2", "20", "20"),
                new BubbleValue("3", "30", "30"),
                new BubbleValue("4", "40", "40"),
                new BubbleValue("5", "50", "50")
        );
        return JSONArray.parseArray(JSONObject.toJSONString(bubbleValues));
    }
}

